<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>TwitterCloneの説明</title>
<meta name="copyright" content="[[HTMLSlidyMakerConfig::Copyright]]" />
<meta name="font-size-adjustment" content="-1" />
<link rel="stylesheet" type="text/css" media="screen, projection, print" href="./slide.css" /> 
  <script src="http://www.w3.org/Talks/Tools/Slidy/slidy.js" 
   charset="utf-8" type="text/javascript"></script> 
 <style type="text/css"> 
 <!-- your custom style rules -->
 </style> 
 </head>
<body>
<div class="slide cover">
<h1>
Twitter Cloneのアーキテクチャ概説
</h1>
<br>
40時間で作るTwitter Clone
<br>
（元ネタ：
<a target="_blank" title="External link to http://skillsmatter.com/podcast/java-jee/javawug-bof-44" href="http://skillsmatter.com/podcast/java-jee/javawug-bof-44" class="externalLink">
Building Twitter with Grails in 40 minutes
</a>
）
<br>
<br>
<hr>
作者：いまいまさのぶ</div>
<div class="slide">
<h1>
はじめに
</h1>
<h2>
ホントウの目的
</h2>
<ul>
<li>
 Grailsを使って，如何にモノを作らずに実装できるのか
</li>
<li>
 Grailsの生産性の高さを実感したい
</li>
<li>
 ひとりプロジェクトでもSCM, PMSを効果的に使えるか
</li>
</ul>
<h2>
リハビリ目的
</h2>
<ul>
<li>
 CSS主体のレイアウトをやってみたい
</li>
<li>
 AJAX使ってみたい
</li>
<li>
 TwitterっぽいURLにしてみたい
</li>
</ul>
<br>
・・・正直，アプリそのものには関心ありません。すいません。
<br>
<br>
</div>
<div class="slide">
<h1>
データモデルについて
</h1>
<a target="_blank" title="External link to http://d.hatena.ne.jp/nowokay/20090304#1236191758" href="http://d.hatena.ne.jp/nowokay/20090304#1236191758" class="externalLink">
きしだモデル
</a>
を参照しています。ありがとうございました。
<br>
あえて，このモデルを無視するのは不経済ですね。
<br>
<img src="it4-model.png" align="right">
<br>
<ul>
<li>
 Account
<ul>
<li>
 ユーザ情報
</li>
</ul>
</li>
<li>
 Status
<ul>
<li>
 発言内容とタイムスタンプを持つ
</li>
</ul>
</li>
<li>
 Timeline
<ul>
<li>
 ユーザ毎のタイムラインを持つ
</li>
<li>
 Statusに対するViewの役割
</li>
</ul>
</li>
<li>
 Reply
<ul>
<li>
 ユーザ宛のメッセージ（Status）へのリンク
</li>
</ul>
</li>
</ul>
<br>
<br>
</div>
<div class="slide">
<h1>
処理モデル
</h1>
ついったーといえば
<strong>
遅延
</strong>
です。
<br>
大事なことはリクエスト中に，どうでも良い処理は後処理にまわす。
<br>
<img src="process-model.jpg">
<br>
つまり，非同期処理が
<strong>
必須
</strong>
</div>
<div class="slide">
<h1>
Grailsとは
</h1>
groovyで作ったrailsみたいなもの（大ざっぱ）。Spring Framework, Hibernate, SitemeshなどのJava資産が使われています。
<br>
<h2>
利点
</h2>
<ul>
<li>
 groovyの表記が簡潔
</li>
<li>
 オールインワンで環境が揃うため，開発がすぐできる
</li>
<li>
 豊富なプラグインによる高い拡張性
</li>
</ul>
<h2>
欠点
</h2>
<ul>
<li>
 typoによるエラーが多発する
</li>
<li>
 シンタックスシュガーが豊富過ぎる
</li>
<li>
 テスト環境が（Railsと比べ）楽しくない
</li>
<li>
 地味にJavaの知識が必要。:-P
</li>
</ul>
<h1>
＞＞多人数による開発には向かないけど，サッとモノを作るのに非常に向いている
</h1>
</div>
<div class="slide">
<h1>
Grails Plugin
</h1>
役立つプラグインばかりでホントウに助かりました。
<br>
<ul>
<li>
 
<a target="_blank" title="External link to http://grails.org/plugin/acegi" href="http://grails.org/plugin/acegi" class="externalLink">
Spring Security Plugin
</a>
<ul>
<li>
 ユーザ認証，ユーザ登録はすべてこれがやってくれました
</li>
</ul>
</li>
<li>
 
<a target="_blank" title="External link to http://grails.org/plugin/jms" href="http://grails.org/plugin/jms" class="externalLink">
JMS Plugin
</a>
と
<a target="_blank" title="External link to http://grails.org/plugin/activemq" href="http://grails.org/plugin/activemq" class="externalLink">
ActiveMQ Plugin
</a>
<ul>
<li>
 これのお陰でSubscriberの登録は２行，メッセージのpublishは1行で完了です。
</li>
<li>
 もう，笑いが止まりません。
</li>
</ul>
</li>
<li>
 
<a target="_blank" title="External link to http://grails.org/plugin/image-tools" href="http://grails.org/plugin/image-tools" class="externalLink">
Image Tools Plugin
</a>
<ul>
<li>
 アイコン画像のリサイズは，これに任せました。
</li>
</ul>
</li>
</ul>
<br>
他にもヒマだったので，
<a target="_blank" title="External link to http://grails.org/plugin/feeds" href="http://grails.org/plugin/feeds" class="externalLink">
Feeds
</a>
と
<a target="_blank" title="External link to http://grails.org/plugin/searchable" href="http://grails.org/plugin/searchable" class="externalLink">
Searchable
</a>
でRSS発行とメッセージ検索を実装してみました。
<br>
おかげさまで，ホントに何も作ってません。:-)</div>
<div class="slide">
<h1>
実装例（DBアクセス）
</h1>
<h2>
タイムラインの取得
</h2>
<pre>
def timelines = Timeline.withCriteria {
  eq 'ownername', username
  maxResults MAX_RESULT
  firstResult(page * MAX_RESULT)
  order 'createDate', 'desc'
}
</pre>
<h2>
フォロアーの削除に伴うタイムラインの更新
</h2>
かっこ悪いけどbulk deleteも出来る
<br>
<pre>
Timeline.executeUpdate("""
  delete Timeline t
  where t.ownername = ?
    and t.statusOwner = (select a from Account a where a.username = ?)
""", [follower.owner.username, follower.target.username])
</pre>
</div>
<div class="slide">
<h1>
実装例（非同期処理）
</h1>
<h2>
Subscriberの宣言
</h2>
<pre>
class TimelineService {
  static expose = ['jms']
  static destination = "queue.timeline"
  def onMessage = {status -&gt;
    :
</pre>
<h2>
指定したSubscribeｒ宛にメッセージをpublishする
</h2>
<pre>
/** つぶやく */
def updateStatus(status) {
  :
  // フォロアーへの通知は非同期で行う
  sendJMSMessage("queue.timeline", status)
}
</pre>
<br>
</div>
<div class="slide">
<h1>
オマケ的要素
</h1>
<ul>
<li>
 アイコンイメージはDBに格納してある
</li>
<li>
 GORMではBLOBの扱いが非常に簡単
</li>
</ul>
<pre>
class AvatorIcon {
  byte[] largeIcon
  byte[] smallIcon
}
</pre>
<ul>
<li>
 それだけじゃツマらないので，
<a target="_blank" title="External link to http://ehcache.sourceforge.net/" href="http://ehcache.sourceforge.net/" class="externalLink">
Ehcache
</a>
でキャッシュしてみた。
</li>
</ul>
</div>
<div class="slide">
<h1>
拡張性
</h1>
<ul>
<li>
 すでにRSS発行，メッセージの全文検索は実装済み
</li>
<li>
 
<a tiddlyfields="server.type:&quot;file&quot; server.host:&quot;www.potto.client.jp/htmlslidymaker&quot;" tiddlylink="RESTful" refresh="link" class="tiddlyLink tiddlyLinkNonExisting" title="The tiddler 'RESTful' doesn't yet exist" href="file:///C:/WORK/grails/twitterClone/docs/wiki/d-cubed.html#RESTful">
RESTful
</a>
 APIに対応するのも難しくはない
</li>
<li>
 GAE/J用にポートするのは，ちょっと難しい
</li>
</ul>
<br>
<ul>
<li>
 機能追加（たとえば，d の実装など）も難なくできると思う。
</li>
<li>
 ただし，Railsでいう migration相当の機能を有していないため，運用面で注意が要るのだと推測している。
</li>
</ul>
</div>
<div class="slide">
<h1>
おわりに
</h1>
<code>
grails stats
</code>
の結果をどうぞ。
<br>
<table class="twtable">
<tbody>
<tr class="evenRow">
<th>
Name
</th>
<th>
Files
</th>
<th>
LOC
</th>
</tr>
<tr class="oddRow">
<td>
Controllers
</td>
<td>
7
</td>
<td>
673
</td>
</tr>
<tr class="evenRow">
<td>
Domain Classes
</td>
<td>
7
</td>
<td>
218
</td>
</tr>
<tr class="oddRow">
<td>
Services
</td>
<td>
4
</td>
<td>
214
</td>
</tr>
<tr class="evenRow">
<td>
Tag Libraries
</td>
<td>
1
</td>
<td>
67
</td>
</tr>
<tr class="oddRow">
<td>
Unit Tests
</td>
<td>
2
</td>
<td>
58
</td>
</tr>
<tr class="evenRow">
<td style="background-color: lightgreen;">
Totals
</td>
<td style="background-color: lightgreen;">
21
</td>
<td style="background-color: lightgreen;">
1,230
</td>
</tr>
</tbody>
</table>
これ以外に画面(GSP)があります。
<br>
<table class="twtable">
<tbody>
<tr class="evenRow">
<th>
Name
</th>
<th>
Files
</th>
<th>
LOC
</th>
</tr>
<tr class="oddRow">
<td>
GSP
</td>
<td>
33
</td>
<td>
1,195
</td>
</tr>
</tbody>
</table>
全部で2,500行くらい。そんなに組んだ気がしないのは，コード生成のおかげでしょう。</div>
</body>
</html>